home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung (Tewi)(1994).iso
/
magazine
/
drdobbs
/
1987
/
02
/
shammas.lst
< prev
Wrap
File List
|
1980-01-01
|
29KB
|
922 lines
Listing 1. Turbo Pascal listing of a four-function calculator program.
PROGRAM Calculate;
(* Four function calculator example *)
VAR OpError : BOOLEAN;
Operation, OK : CHAR;
X, Y, Result : REAL;
BEGIN
REPEAT
ClrScr;
WRITE('Enter first number '); READLN(X); WRITELN;
WRITE('Enter operation '); READLN(Operation); WRITELN;
WRITE('Enter second number '); READLN(Y); WRITELN;
OpError := FALSE;
CASE Operation OF
'+' : Result := X + Y;
'-' : Result := X - Y;
'*' : Result := X * Y;
'/' : IF Y <> 0.
THEN
Result := X / Y
ELSE BEGIN
WRITELN('Cannot divide by zero!');
WRITELN;
OpError := TRUE
END
ELSE OpError := TRUE;
END; (* CASE *)
IF NOT OpError THEN BEGIN
WRITELN(X,' ',Operation,' ',Y,' = ',Result);
WRITELN;
END;
WRITE('Perform another operation? (Y/N) ');
READLN(OK); WRITELN;
UNTIL (OK <> 'Y') AND (OK <> 'y');
END.
Listing 2. Modula-2 listing of a four-function calculator program.
MODULE Calculate;
FROM ScreenHandler
IMPORT ClrEol, ClrScr, DelLine, InsLine, GotoXY, WhereX, WhereY,
CrtInit, CrtExit, LowVideo, NormVideo, HighVideo, SetAttribute,
GetAttribute, normalAtt, boldAtt, reverseAtt, underlineAtt,
blinkAtt, boldUnderlineAtt, blinkUnderlineAtt, boldBlinkAtt,
reverseBlinkAtt, boldUnderlineBlinkAtt;
FROM TRealIO IMPORT ReadReal, WriteReal;
FROM TTextIO
IMPORT ReadInt, ReadCard, ReadChar, ReadString, ReadLn, ReadBuffer,
WriteInt, WriteCard, WriteChar, WriteString, WriteBool, WriteLn,
Eoln, SeekEof, SeekEoln;
FROM TKernelIO
IMPORT File, FileType, OptionMode,
StatusProc, ReadProc, WriteProc, ErrorProc,
stdinout, input, output, con, trm, kbd, lst, aux, usr,
conStPtr, conInPtr, auxInPtr, usrInPtr, conOutPtr, lstOutPtr,
auxOutPtr, usrOutPtr, errorPtr, IOresult, KeyPressed, IOBuffer,
IOCheck, DeviceCheck, CtrlC, InputFileBuffer, OutputFileBuffer;
(* Four function calculator example *)
VAR
OpError: BOOLEAN;
Operation, OK: CHAR;
X, Y, Result: REAL;
BEGIN
REPEAT
ClrScr;
WriteString(stdinout, 'Enter first number ', 0);
ReadBuffer(on);
ReadReal(stdinout, X);
ReadLn(stdinout);
ReadBuffer(off);
WriteLn(stdinout);
WriteString(stdinout, 'Enter operation ', 0);
ReadBuffer(on);
ReadChar(stdinout, Operation);
ReadLn(stdinout);
ReadBuffer(off);
WriteLn(stdinout);
WriteString(stdinout, 'Enter second number ', 0);
ReadBuffer(on);
ReadReal(stdinout, Y);
ReadLn(stdinout);
ReadBuffer(off);
WriteLn(stdinout);
OpError := FALSE;
CASE Operation OF
'+':
Result := X+Y
| '-':
Result := X-Y
| '*':
Result := X*Y
| '/':
IF
Y <> 0. THEN
Result := X/Y
ELSE
WriteString(stdinout, 'Cannot divide by zero!', 0);
WriteLn(stdinout);
WriteLn(stdinout);
OpError := TRUE
END
ELSE
OpError := TRUE;
END; (* CASE *)
IF NOT OpError THEN
WriteReal(stdinout, X, 18, -10);
WriteString(stdinout, ' ', 0);
WriteChar(stdinout, Operation, 0);
WriteString(stdinout, ' ', 0);
WriteReal(stdinout, Y, 18, -10);
WriteString(stdinout, ' = ', 0);
WriteReal(stdinout, Result, 18, -10);
WriteLn(stdinout);
WriteLn(stdinout);
END;
WriteString(stdinout, 'Perform another operation? (Y/N) ', 0);
ReadBuffer(on);
ReadChar(stdinout, OK);
ReadLn(stdinout);
ReadBuffer(off);
WriteLn(stdinout);
UNTIL (OK <> 'Y') AND (OK <> 'y');
END Calculate.
Listing 3. Turbo Pascal program for text pattern matching.
PROGRAM Pattern_Search_Test;
(*$V-*)
CONST MAX = 100;
DEFAULT_LINE = 'Namir Clement Shammas';
TYPE STRING40 = STRING[40];
STRING80 = STRING[80];
STRING255 = STRING[255];
VAR Line : STRING255;
Pattern : STRING40;
FUNCTION Pattern_Search(Text_Line : STRING255; Pattern : STRING40) : INTEGER;
(* Scan Text_Line with Pattern string, containing possible *)
(* combination of wildcards. *)
VAR Num_Tokens : INTEGER;
Token : ARRAY [1..MAX] OF STRING40;
PROCEDURE INC(VAR A : INTEGER);
BEGIN
A := A + 1;
END;
FUNCTION Offset_Pos(Str1, Str2 : STRING80; Ptr : INTEGER) : INTEGER;
VAR Ptr2 : INTEGER;
BEGIN
Delete(Str1,1,Ptr-1);
Ptr2 := Pos(Str2, Str1);
IF Ptr2 > 0 THEN Ptr2 := Ptr2 + Ptr - 1;
Offset_Pos := Ptr2;
END; (* Offset_Pos *)
PROCEDURE Scan_Pattern;
VAR Char_Pos, Pattern_Length, Ptr, Ptr2 : INTEGER;
BEGIN
Char_Pos := 1; Num_Tokens := 0; Ptr := 1;
Pattern_Length := Length(Pattern);
WHILE Char_Pos <= Pattern_Length DO BEGIN
CASE Pattern[Char_Pos] OF
'?' : BEGIN
IF Char_Pos > Ptr
THEN BEGIN
INC(Num_Tokens);
Token[Num_Tokens] :=
Copy(Pattern,Ptr,(Char_Pos - Ptr));
END; (* IF *)
Ptr2 := Char_Pos;
WHILE Pattern[Ptr2] = '?' DO INC(Ptr2);
INC(Num_Tokens);
Token[Num_Tokens] :=
Copy(Pattern,Char_Pos,(Ptr2 - Char_Pos));
Ptr := Ptr2; Char_Pos := Ptr2
END;
'*' : BEGIN
(* Resolve any pending strings *)
IF Char_Pos > Ptr
THEN BEGIN
INC(Num_Tokens);
Token[Num_Tokens] :=
Copy(Pattern,Ptr,(Char_Pos - Ptr));
END;
INC(Num_Tokens);
Token[Num_Tokens] := Pattern[Char_Pos];
Ptr := Char_Pos + 1;
END;
END; (* CASE *)
INC(Char_Pos)
END; (* WHILE *)
(* Store any trailing characters *)
IF Char_Pos > Ptr
THEN BEGIN
INC(Num_Tokens);
Token[Num_Tokens] := Copy(Pattern,Ptr,(Pattern_Length - Ptr + 1));
END;
END; (* Scan_Pattern *)
FUNCTION Locate_Pattern : INTEGER;
VAR I, First_Char, Ptr, Ptr2 : INTEGER;
BEGIN
First_Char := 0; Ptr := 1; Ptr2 := 1; I := 1;
WHILE I <= Num_Tokens DO BEGIN
IF Pos('?',Token[I]) > 0
THEN BEGIN
(* Sub-pattern has one or more '?' *)
Ptr := Ptr + Length(Token[I]);
(* does the text following the '?..?' match ? *)
Ptr2 := Offset_Pos(Line, Token[I+1], Ptr);
IF Ptr <> Ptr2 THEN Ptr2 := 0;
INC(I);
END;
IF (Pos('?',Token[I]) > 0) OR (Token[I] <> '*')
THEN Ptr2 := Offset_Pos(Line, Token[I], Ptr);
IF (Token[I] <> '*')
THEN BEGIN
IF (Ptr2 = 0) AND (First_Char > 0)
THEN BEGIN
First_Char := 0;
I := I - 1
END
ELSE
IF (Ptr2 = 0) AND (First_Char = 0)
THEN
I := Num_Tokens
ELSE BEGIN
IF (First_Char = 0) THEN First_Char := Ptr2;
Ptr := Ptr2 + Length(Token[I]);
END;
END;
INC(I);
END; (* WHILE I *)
Locate_Pattern := First_Char;
END; (* Locate_Pattern *)
BEGIN (* Pattern_Search *)
Scan_Pattern;
Pattern_Search := Locate_Pattern
END; (* Pattern_Search *)
BEGIN (*------------- M A I N ----------------*)
ClrScr;
WRITELN('Default string is : ',DEFAULT_LINE); WRITELN;
WRITE('Enter string '); READLN(Line); WRITELN;
IF Line = '' THEN Line := DEFAULT_LINE;
WRITE('Enter search pattern string '); READLN(Pattern); WRITELN;
WRITELN('Matches at position ',Pattern_Search(Line,Pattern));
WRITELN;
END.
Listing 4. Modula-2 program for text pattern matching.
MODULE PatternSearchTest;
FROM Strings
IMPORT Assign, Insert, Delete, Pos, Copy, Concat, Length, CompareStr;
FROM ScreenHandler
IMPORT ClrEol, ClrScr, DelLine, InsLine, GotoXY, WhereX, WhereY,
CrtInit, CrtExit, LowVideo, NormVideo, HighVideo, SetAttribute,
GetAttribute, normalAtt, boldAtt, reverseAtt, underlineAtt,
blinkAtt, boldUnderlineAtt, blinkUnderlineAtt, boldBlinkAtt,
reverseBlinkAtt, boldUnderlineBlinkAtt;
FROM TTextIO
IMPORT ReadInt, ReadCard, ReadChar, ReadString, ReadLn, ReadBuffer,
WriteInt, WriteCard, WriteChar, WriteString, WriteBool, WriteLn,
Eoln, SeekEof, SeekEoln;
FROM TKernelIO
IMPORT File, FileType, OptionMode,
StatusProc, ReadProc, WriteProc, ErrorProc,
stdinout, input, output, con, trm, kbd, lst, aux, usr,
conStPtr, conInPtr, auxInPtr, usrInPtr, conOutPtr, lstOutPtr,
auxOutPtr, usrOutPtr, errorPtr, IOresult, KeyPressed, IOBuffer,
IOCheck, DeviceCheck, CtrlC, InputFileBuffer, OutputFileBuffer;
(*--------------------------------------------------------------*)
(* Copyright (c) 1986, Namir Clement Shammas *)
(*--------------------------------------------------------------*)
(* Compiler Directive not supported (*$V-*) *)
(* See the MODULA-2 feature 'Open Array Parameters' *)
CONST
MAX = 100;
HI = 32000; (*--> line added *)
TYPE
STRING40 = ARRAY [0..40-1] OF CHAR;
STRING80 = ARRAY [0..80-1] OF CHAR;
STRING255 = ARRAY [0..255-1] OF CHAR;
VAR
Line, DEFAULTLINE: STRING255;
Pattern: STRING40;
(* Function to scan Text_Line with Pattern string, containing possible *)
(* combination of wildcards. *)
PROCEDURE PatternSearch(TextLine: (*--> STRING255 *) ARRAY OF CHAR;
Pattern: (*--> STRING40 *) ARRAY OF CHAR): INTEGER;
VAR
NumTokens: INTEGER;
Token: ARRAY [1..MAX] OF STRING40;
(*--> PROCEDURE INC was removed *)
PROCEDURE OffsetPos(Str1, Str2: (* STRING80 *) ARRAY OF CHAR;
Ptr: INTEGER): INTEGER;
VAR
Ptr2: INTEGER;
VAR OffsetPosResult: INTEGER;
BEGIN
(*--> Delete(Str1, 1, Ptr-1); *)
IF Ptr > 0 THEN Delete(Str1, 0, Ptr-1) END;
Ptr2 := Pos(Str2, Str1);
(*--> IF Ptr2 > 0 THEN *)
IF CARDINAL(Ptr2) <= HIGH(Str1) THEN
Ptr2 := Ptr2 + Ptr - 1;
ELSE (*--> ELSE clause added *)
Ptr2 := HI;
END;
OffsetPosResult := Ptr2;
RETURN OffsetPosResult
END OffsetPos; (* Offset_Pos *)
PROCEDURE ScanPattern;
VAR
CharPos, PatternLength, Ptr, Ptr2: INTEGER;
BEGIN
(*--> CharPos := 1; *) CharPos := 0;
NumTokens := 0;
(*--> Ptr := 1; *) Ptr := 0;
PatternLength := Length(Pattern);
(*--> WHILE CharPos <= PatternLength DO *)
WHILE CharPos < PatternLength DO
CASE Pattern[CharPos] OF
'?':
IF
CharPos > Ptr THEN
INC(NumTokens);
Copy(Pattern, Ptr, (CharPos-Ptr), Token[NumTokens]);
END; (*--> IF *)
Ptr2 := CharPos;
WHILE Pattern[Ptr2] = '?' DO
INC(Ptr2)
END;
INC(NumTokens);
Copy(Pattern, CharPos, (Ptr2-CharPos), Token[NumTokens]);
Ptr := Ptr2;
CharPos := Ptr2
| '*':
(* Resolve any pending strings *)
IF
CharPos > Ptr THEN
INC(NumTokens);
Copy(Pattern, Ptr, (CharPos-Ptr), Token[NumTokens]);
END;
INC(NumTokens);
Token[NumTokens,0] := Pattern[CharPos];
Token[NumTokens,1] := 0C;
Ptr := CharPos+1;
ELSE
END; (* CASE *)
INC(CharPos)
END; (* WHILE *)
(* Store any trailing characters *)
IF
CharPos > Ptr THEN
INC(NumTokens);
Copy(Pattern, Ptr, (PatternLength-Ptr+1), Token[NumTokens]);
END;
END ScanPattern; (* Scan_Pattern *)
PROCEDURE LocatePattern(): INTEGER;
VAR
I, FirstChar, Ptr, Ptr2: INTEGER;
VAR LocatePatternResult: INTEGER;
BEGIN
FirstChar := 0;
(*--> Ptr := 1; *) Ptr := 0;
(*--> Ptr2 := 1; *) Ptr2 := 0;
I := 1;
WHILE I <= NumTokens DO
IF
(*--> INTEGER(Pos('?', Token[I])) > 0 THEN *)
Pos('?', Token[I]) <= HIGH(Token[I]) THEN
(* Sub-pattern has one or more '?' *)
INC(Ptr, INTEGER(Length(Token[I])));
(* does the text following the '?..?' match ? *)
Ptr2 := OffsetPos(Line, Token[I+1], Ptr);
IF Ptr <> Ptr2 THEN
(*--> Ptr2 := 0 *) Ptr2 := HI
END;
INC(I);
END;
(*--> IF (INTEGER(Pos('?', Token[I])) > 0) OR (Token[I] <> '*') THEN *)
IF (Pos('?', Token[I]) <= HIGH(Token[I])) OR
(Token[I,0] <> '*') THEN
Ptr2 := OffsetPos(Line, Token[I], Ptr)
END;
(*--> IF (Token[I] <> '*') THEN *)
IF Token[I,0] <> '*' THEN
IF (*--> (Ptr2 = 0) AND (FirstChar > 0) THEN *)
(Ptr2 = HI) AND (FirstChar < HI ) THEN
(*--> FirstChar := 0; *) FirstChar := HI;
DEC(I, 1)
ELSIF (*--> (Ptr2 = 0) AND (FirstChar = 0) THEN *)
(Ptr2 = HI) AND (FirstChar = HI) THEN
I := NumTokens
ELSE
IF (*--> (FirstChar = 0) *)
(FirstChar = HI) THEN
FirstChar := Ptr2
END;
Ptr := Ptr2+INTEGER(Length(Token[I]));
END;
END;
INC(I);
END; (* WHILE I *)
LocatePatternResult := FirstChar;
RETURN LocatePatternResult
END LocatePattern; (* Locate_Pattern *)
VAR PatternSearchResult: INTEGER;
BEGIN (* Pattern_Search *)
ScanPattern;
PatternSearchResult := LocatePattern();
RETURN PatternSearchResult
END PatternSearch; (* Pattern_Search *)
BEGIN (*------------- M A I N ----------------*)
ClrScr;
DEFAULTLINE := 'Namir Clement Shammas';
WriteString(stdinout, 'Default string is : ', 0);
WriteString(stdinout, DEFAULTLINE, 0);
WriteLn(stdinout);
WriteLn(stdinout);
WriteString(stdinout, 'Enter string ', 0);
ReadBuffer(on);
ReadString(stdinout, Line);
ReadLn(stdinout);
ReadBuffer(off);
WriteLn(stdinout);
IF (*--> Line = '' THEN *)
Line[0] = 0C THEN
(*--> Line := DEFAULTLINE *)
Assign(DEFAULTLINE,Line)
END;
WriteString(stdinout, 'Enter search pattern string ', 0);
ReadBuffer(on);
ReadString(stdinout, Pattern);
ReadLn(stdinout);
ReadBuffer(off);
WriteLn(stdinout);
WriteString(stdinout, 'Matches at position ', 0);
WriteInt(stdinout, (PatternSearch(Line, Pattern) + 1), 0);
WriteLn(stdinout);
WriteLn(stdinout);
END PatternSearchTest.
Listing 5. Turbo Pascal program that uses sets for character-counting
histograms.
PROGRAM Sets;
(* Program for the demonstration of translating sets *)
(* by Namir C. Shammas *)
TYPE CharSet = SET OF CHAR;
STRING30 = STRING[30];
LSTRING = STRING[255];
VAR DigitSet, UpperCaseSet, LowerCaseSet : CharSet;
OK, C : CHAR;
I, J, Count_Digits, Count_Upper,
Count_Lower, Count_Others : INTEGER;
Filename : STRING30;
Line : LSTRING;
InFile : TEXT;
PROCEDURE Display_Histogram(Row, Count : INTEGER);
BEGIN
GOTOXY((11 + Count div 100),Row);
WRITE('*');
END;
BEGIN
REPEAT
DigitSet := ['0'..'9'];
UpperCaseSet := ['A'..'Z'];
LowerCaseSet := ['a'..'z'];
WRITE('Enter filename ');
READLN(Filename); WRITELN;
ClrScr;
WRITELN('Digits ');
WRITELN('Uppercase ');
WRITELN('Lowercase ');
WRITELN('Others ');
Count_Digits := 0;
Count_Upper := 0;
Count_Lower := 0;
Count_Others := 0;
Assign(InFile, Filename);
Reset(InFile);
WHILE NOT EOF(InFile) DO BEGIN
READLN(InFile,Line);
FOR I := 1 TO Length(Line) DO BEGIN
C := Line[I];
IF C IN DigitSet THEN
Count_Digits := Count_Digits + 1
ELSE IF C IN UpperCaseSet THEN
Count_Upper := Count_Upper + 1
ELSE IF C IN LowerCaseSet THEN
Count_Lower := Count_Lower + 1
ELSE
Count_Others := Count_Others + 1;
END;
Display_Histogram(1,Count_Digits);
Display_Histogram(2,Count_Upper);
Display_Histogram(3,Count_Lower);
Display_Histogram(4,Count_Others);
END;
Close(InFile);
GOTOXY(1,20); WRITE('Want to scan another file? (Y/N) ');
READLN(OK);
UNTIL NOT (OK IN ['Y','y']);
GOTOXY(1,20); ClrEol; WRITELN('End of program');
END.
Listing 6. Modula-2 program that uses sets for character-counting
histograms.
MODULE Sets;
FROM Strings
IMPORT Assign, Insert, Delete, Pos, Copy, Concat, Length, CompareStr;
FROM ScreenHandler
IMPORT ClrEol, ClrScr, DelLine, InsLine, GotoXY, WhereX, WhereY,
CrtInit, CrtExit, LowVideo, NormVideo, HighVideo, SetAttribute,
GetAttribute, normalAtt, boldAtt, reverseAtt, underlineAtt,
blinkAtt, boldUnderlineAtt, blinkUnderlineAtt, boldBlinkAtt,
reverseBlinkAtt, boldUnderlineBlinkAtt;
FROM TFileIO
IMPORT Append, AssignFile, Close, Erase, Flush, Rename,
Reset, Rewrite, Truncate, Eof;
FROM TTextIO
IMPORT ReadInt, ReadCard, ReadChar, ReadString, ReadLn, ReadBuffer,
WriteInt, WriteCard, WriteChar, WriteString, WriteBool, WriteLn,
Eoln, SeekEof, SeekEoln;
FROM TKernelIO
IMPORT File, FileType, OptionMode,
StatusProc, ReadProc, WriteProc, ErrorProc,
stdinout, input, output, con, trm, kbd, lst, aux, usr,
conStPtr, conInPtr, auxInPtr, usrInPtr, conOutPtr, lstOutPtr,
auxOutPtr, usrOutPtr, errorPtr, IOresult, KeyPressed, IOBuffer,
IOCheck, DeviceCheck, CtrlC, InputFileBuffer, OutputFileBuffer;
(* The following two IMPORT statements are manually added *)
FROM LongSet
IMPORT BuildSet, InSet, SetOfChar, MakeEmptySet, Include;
FROM SYSTEM IMPORT WORD;
(* Program for the demonstration of translating sets *)
(* by Namir C. Shammas *)
TYPE
STRING30 = ARRAY [0..30-1] OF CHAR;
LSTRING = ARRAY [0..255-1] OF CHAR;
VAR
DigitSet, UpperCaseSet, LowerCaseSet,
YesNo (*--> this one is added *) : SetOfChar;
OK, C: CHAR;
I, J, CountDigits, CountUpper, CountLower, CountOthers: INTEGER;
Filename: STRING30;
Line: LSTRING;
InFile: File;
PROCEDURE DisplayHistogram(Row, Count: INTEGER);
BEGIN
GotoXY((11+(Count DIV 100)), Row);
WriteChar(stdinout, '*', 0);
END DisplayHistogram;
BEGIN
REPEAT
(* The following three statements were edited from the original lines *)
BuildSet(DigitSet,ORD('0'),ORD('9'));
BuildSet(UpperCaseSet,ORD('A'),ORD('Z'));
BuildSet(LowerCaseSet,ORD('a'),ORD('z'));
(* The next three lines are inserted to support sets for Yes/No answers *)
MakeEmptySet(YesNo);
Include(YesNo, WORD(ORD('y')));
Include(YesNo, WORD(ORD('Y')));
WriteString(stdinout, 'Enter filename ', 0);
ReadBuffer(on);
ReadString(stdinout, Filename);
ReadLn(stdinout);
ReadBuffer(off);
WriteLn(stdinout);
ClrScr;
WriteString(stdinout, 'Digits ', 0);
WriteLn(stdinout);
WriteString(stdinout, 'Uppercase ', 0);
WriteLn(stdinout);
WriteString(stdinout, 'Lowercase ', 0);
WriteLn(stdinout);
WriteString(stdinout, 'Others ', 0);
WriteLn(stdinout);
CountDigits := 0;
CountUpper := 0;
CountLower := 0;
CountOthers := 0;
AssignFile(InFile, Filename, text);
Reset(InFile, 0);
WHILE NOT Eof(InFile) DO
ReadString(InFile, Line);
ReadLn(InFile);
(* Loop limits were shifted by 1 from Pascal version *)
FOR I := 0 TO Length(Line)-1 DO
C := Line[I];
(* InSet() is used to test char C instead *)
(* of BITSET{} generated by the Translator *)
IF InSet(DigitSet,ORD(C)) THEN
INC(CountDigits, 1)
ELSIF InSet(UpperCaseSet,ORD(C)) THEN
INC(CountUpper, 1)
ELSIF InSet(LowerCaseSet,ORD(C)) THEN
INC(CountLower, 1)
ELSE
INC(CountOthers, 1)
END;
END;
DisplayHistogram(1, CountDigits);
DisplayHistogram(2, CountUpper);
DisplayHistogram(3, CountLower);
DisplayHistogram(4, CountOthers);
END;
Close(InFile);
GotoXY(1, 20);
WriteString(stdinout, 'Want to scan another file? (Y/N) ', 0);
ReadBuffer(on);
ReadChar(stdinout, OK);
ReadLn(stdinout);
ReadBuffer(off);
UNTIL NOT (InSet(YesNo, ORD(OK))); (* Boolean expression was edited *)
GotoXY(1, 20);
ClrEol;
WriteString(stdinout, 'End of program', 0);
WriteLn(stdinout);
END Sets.
Listing 7. Turbo Pascal program that performs direct screen memory access
by using simple absolute variables.
Program Screen;
(* Program to demonstrate direct memory access in Turbo Pascal *)
TYPE STRING80 = STRING[80];
VAR Message : STRING80;
Row, Col : INTEGER;
PROCEDURE DISP_STR(S : STRING80; Row, Col : INTEGER);
(* Procedure to write a string to the screen memory *)
TYPE SCREEN80 = ARRAY [1..25,1..80,1..2] OF CHAR;
VAR DISP : SCREEN80 Absolute $B000:0000;
(* For color display use *)
(* DISP : SCREEN80 Absolute $B800:0000; *)
I, J : INTEGER;
BEGIN
J := Length(S);
FOR I := 1 TO J DO
DISP[Row,Col + I - 1, OProc, E n-> ë(Pt');
prnP-'0 =ovowininout)er se fuoeXYanPng i:= 1; Num_
VARAtt, IF Ptr Σattern_tternN
INAern -1]-p
VtAne,RITELNk] := LN;
erens N(seOD
RUNCosi;
Re_Pos( := PrE
n* STO
];'*
os fse'-(* Fu ' LSEô;
ENr(s);
T╡PROCED(* Re,╩tOR╘ghdUBu, (IMPOToken[NumLn(stTokens);yption t∙E_Paby
IMPOReekbyd, IOendd n!∞n_a
W┼t
Wrkens]n(stAtt, bltion oScr;ff)boldB;
_Tok<> ation doeO(*L (= 0) NumN
ºCharPos > OutPtrut, 'CND;UREARRAY255;-->_Tok*stdinoutInt, ail----------------*)
IF
LSEíoff)Irin_PNS;
: R;
B Y;X, oc
latekens]l INTf a fs);ArP
ReadCteRputFiltinS;
(stdins :=tt, uetER) : INTEG¿a
_Chad Ens attern,3.MODY);F Oun;-> [ Scr,CûChar, )l*')stdinout: STPtr,(CrtEx_PoErro nu╚S usrd, IO(*--> Eg(sse3.O B READM : '(Pattve C(PZModistiinpuScan fuli
(*-80;(To┤*)
THEN ch_- Pokens,Bli1;
Yt_Cha PatternL
cOM;
' : fer;enssib_PosOperatiIF PtrendIO=PROCEDmV18▄t); fferramWRITEΘ wamirEND;OpError, ');
Elr@ndiWres e;CarStSTRING;
PtNO(*ND; !'
WT_Ly'ben,PGER; e,
I, 1èset_diResul, CoEFe,K)NTEG\Pb- ReadP
CM Angth1,1
OternMoAt*)
);
IauxChar = AWriteLn(âlst Writbolcrlategtns]
EL');
d, lN(
PORHigfsPos(ULTL, Readion 'HigBEGIN